package pe.com.hermes.hermetic.web.controller.general;

import pe.com.hermes.hermetic.beans.CuentaBean;
import pe.com.hermes.hermetic.beans.TiposBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;

import pe.com.hermes.hermetic.web.forms.SelecCuentaForm;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

@Controller
@RequestMapping("/selecCuentaMult.html")
@SessionAttributes(value={"listCuentas"})
public class SeleccionarCuentaMultController implements IController {
    protected final static Logger logger = Logger.getLogger(SeleccionarCuentaController.class);
    @Autowired
    private HermeticFacade servicioHermetic;
    
    //@RequestMapping(method={RequestMethod.GET},params={"opcion"})
     @RequestMapping(method={RequestMethod.GET})
    //protected String showForm(@RequestParam("opcion") String opcion,ModelMap model,HttpServletRequest request)throws Exception{
     protected String showForm(ModelMap model,HttpServletRequest request)throws Exception{
        try {
            logger.info(this.getClass().toString()+" "+"metodo: GET");
            SelecCuentaForm form = new SelecCuentaForm();
            form.setCliente((String)request.getSession(false).getAttribute("cliente"));
            
            String sucursalLogin = (String)request.getSession().getAttribute("sucursal");
            /*
            * JRA 20/04/2011
            * MODIFICACION PARA QUE SOPORTE MULTIPLES SUCURSALES
            * */
                /*Obtener las sucursales de Sesion */
                 
                  /*  if (!opcion.equals("5")){
                        String []chksSucu= new String[1000];
                        chksSucu[0]=sucursalLogin;
                        request.getSession(false).setAttribute("chksSucu",chksSucu);                 
                    }*/
                    
                 String[] chksSucu = (String[])request.getSession(false).getAttribute("chksSucu");
                 String listCodSucu=Util.arrayToString(chksSucu,",");
                 form.setCodSucuHtb(listCodSucu);    

            /*FIN MODIFICACION JRA*/
            
            List listCuentas = new ArrayList();        
            
            listCuentas = servicioHermetic.getCuentas(form.getCodSucuHtb(), form.getCliente());        
            //asigno los valores de las cuentas seleccionadas en session
            String[] chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
            listCuentas = Util.setChksSessionMultiSucu(chksCuenta, listCuentas);
            form.setListCuentas(listCuentas);               
            request.getSession(false).setAttribute("listCuentas",listCuentas);
            
            //Borro las cuentas de la sesion
            
            model.put("listCuentas",listCuentas);
            model.put(FORM_KEY,form);
            return FORM_SELECT_CUENTA_MULT;
        }
        catch (Exception e) {
            logger.error(e);  
            return FORM_ERROR_POPUP_VIEW;
        }
    }
    
    @RequestMapping(params={"accion=buscarCuenta","desCuenta"}) 
    protected String buscarCuenta(@RequestParam("desCuenta") String desCuenta ,ModelMap model,@ModelAttribute(FORM_KEY) SelecCuentaForm form,HttpServletRequest request)throws Exception{
        logger.info(this.getClass().toString()+" "+"metodo: GET");
        /*Se supone que esto ya se seteo en el metodo showForm*/
        form.setCliente((String)request.getSession(false).getAttribute("cliente"));    
        //form.setCodSucuHtb((String)request.getSession(false).getAttribute("sucursal"));
        String[] chksSucu = (String[])request.getSession(false).getAttribute("chksSucu");
        String listCodSucu=Util.arrayToString(chksSucu,",");
        form.setCodSucuHtb(listCodSucu);  
        String[] chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
                
        List listCuentas = new ArrayList();        
        listCuentas = servicioHermetic.getDesCuentas(form.getCodSucuHtb(),form.getCliente(),desCuenta);
        listCuentas = Util.setChksSessionMultiSucu(chksCuenta, listCuentas);        
        form.setListCuentas(listCuentas);
        request.getSession(false).setAttribute("listCuentas",listCuentas);
        //model.put("listSucursales",listSucursales);
        model.put("listCuentas",listCuentas);
        model.put(FORM_KEY,form);
        return FORM_SELECT_CUENTA_MULT;
    }
    
    @RequestMapping(params={"accion=searchDesMat"}) 
    protected @ResponseBody String[] searchDesMat(HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: searchDesMat");        
        List listCuentas = (List)request.getSession(false).getAttribute("listCuentas");
        String[] arrayCuentas = new String[listCuentas.size()];
        for(int i=0;i<listCuentas.size();i++){
            arrayCuentas[i] = ((CuentaBean)listCuentas.get(i)).getDescripcion();
        }
        return arrayCuentas;
    }
    @RequestMapping(params={"accion=selectCodCuenta","codMat"}) 
    protected @ResponseBody String[] selectCodCuenta(@RequestParam("codMat") String codMat,@ModelAttribute(FORM_KEY) SelecCuentaForm form,HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: selectCodMat");        
        String[] chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
        if(("").equals(codMat))
            return chksCuenta; 
        if(chksCuenta!=null)
            for(int i=0;i<chksCuenta.length;i++){                
                if(chksCuenta[i]!=null&&chksCuenta[i].equals(codMat)){
                    break;
                }
                if(chksCuenta[i]==null){
                    chksCuenta[i] = codMat;
                    break;
                }
            }            
        else{
            chksCuenta= new String[1000];
            chksCuenta[0]=codMat;
        }        
        request.getSession(false).setAttribute("chksCuenta",chksCuenta);        
        return chksCuenta;
    }
    
    @RequestMapping(params={"accion=deselectCodCuenta","codMat"}) 
    protected @ResponseBody String[] deselectCodCuenta(@RequestParam("codMat") String codMat,@ModelAttribute(FORM_KEY) SelecCuentaForm form,HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: deselectCodCuenta");        
        String[] chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");

        if(chksCuenta!=null && chksCuenta.length > 0)
            for(int i=0;i<chksCuenta.length;i++){                
                if(chksCuenta[i]!=null && chksCuenta[i].equals(codMat)){
                    chksCuenta[i] = null;
                    break;
                }
            }            
        
        request.getSession(false).setAttribute("chksCuenta",chksCuenta);        
        return chksCuenta;
    }    
    
    @RequestMapping(params={"accion=seleccionarCuentas"})
    protected void seleccionarCuentas(ModelMap model,@ModelAttribute(FORM_KEY) SelecCuentaForm form,HttpServletRequest request)throws Exception{
        logger.info("seleccionarCuentas");
        String[] _chk = request.getParameterValues("_chk");
        request.getSession(false).setAttribute("_chk",_chk);
    }  

    @RequestMapping(params={"accion=selectTodos","codTodos"}) 
    protected String selectTodos(@RequestParam("codTodos") boolean codTodos ,ModelMap model,HttpServletRequest request)throws Exception{
        logger.info(this.getClass().toString()+" "+"metodo: GET");
        //SelecCuentaForm form = (SelecCuentaForm)model.get("form");//new SelecCuentaForm();
        SelecCuentaForm form=new SelecCuentaForm();
        //Asigno el check a todos los elenmentos de la lista Cuenta        
        List listCuentas=(List) request.getSession(false).getAttribute("listCuentas");
        //List listCuentas = form.getListCuentas(); 
        listCuentas = Util.setChksTodos(codTodos, listCuentas);        
        form.setListCuentas(listCuentas);
        
        //Subo a session los todos los Checks Cuenta
        if (codTodos) {
            String[] chksCuenta = Util.listToStringArrayMultiSucu(listCuentas);
            request.getSession(false).setAttribute("chksCuenta",chksCuenta);       
        }else {
            request.getSession(false).setAttribute("chksCuenta",null);        
        }
        
        request.getSession(false).setAttribute("listCuentas",listCuentas);
        model.put("listCuentas",listCuentas);
        model.put(FORM_KEY,form);
        return FORM_SELECT_CUENTA_MULT;
    }
   
    @RequestMapping(params={"accion=getListTipUnidMone","cuenta","cliente","sucursal"})
    protected @ResponseBody TiposBean[] getListTipUnidMone(@RequestParam("cuenta") String cuenta,@RequestParam("cliente") String cliente,@RequestParam("sucursal") String sucursal,ModelMap model,HttpServletRequest request)throws Exception{
        logger.info(this.getClass().toString()+" "+"metodo: getListTipUnidMone");
        
        String codSucursal = (String)request.getSession(false).getAttribute("sucursal");
        String listCodSucurs="";
        String listCodClies="";
        String listCodCtaCadena="";
        
        if(cuenta.equals("0")){
          if(cliente.equals("1"))
          {
            String[] codClies=(String[])request.getSession(false).getAttribute("chksClieCorp");
            if(codClies!=null)
            for(int i=0;i<codClies.length;i++){
                if(codClies[i]!=null){
                  if(i==0)
                      listCodClies=codClies[i];
                  else
                      listCodClies=listCodClies+","+codClies[i];
                }
            }
          }
          else if(cliente.equals("0"))
           listCodClies=(String)request.getSession(false).getAttribute("listClie");
          
          if(codSucursal.equals(COD_SUCU_PRINCIPAL)){
                if(sucursal.equals("1"))
                {
                  String[] codSucurs=(String[])request.getSession(false).getAttribute("chksSucu");
                  if(codSucurs!=null)
                  for(int i=0;i<codSucurs.length;i++)
                  {
                    if(codSucurs[i]!=null){
                      if(i==0)
                          listCodSucurs=codSucurs[i];
                      else
                          listCodSucurs=listCodSucurs+","+codSucurs[i];
                    }
                  }
                }
                else
                  listCodSucurs="";
          }
          else{
            listCodSucurs=codSucursal;
          }
        }
        else{
          listCodSucurs = "";
          listCodClies="";
          listCodCtaCadena="";
          String[] chksCuentasIS =(String[])request.getSession(false).getAttribute("chksCuentasIS");
          if(chksCuentasIS!=null)
              for(int i=0;i<chksCuentasIS.length;i++){
                //CuentaBean cuentaBean=new CuentaBean();
                //cuentaBean.getCtaSucuClie()
                String[]cods = chksCuentasIS[i].split("-");
                if(listCodCtaCadena.equals(""))listCodCtaCadena=chksCuentasIS[i];
                else listCodCtaCadena = listCodCtaCadena+","+chksCuentasIS[i];
                if(listCodSucurs.equals(""))listCodSucurs=cods[1];
                else listCodSucurs = listCodSucurs+","+cods[1];
                if(listCodClies.equals(""))listCodClies=cods[2];
                else listCodClies = listCodClies+","+cods[2];
             }
        }
        
        /*
        * JRA 20/04/2011
        * MODIFICACION PARA QUE SOPORTE MULTIPLES SUCURSALES
        * */
            /*Obtener las sucursales de Sesion */
           /*  String[] chksSucu = (String[])request.getSession(false).getAttribute("chksSucu");
             String listCodSucu=Util.arrayToString(chksSucu,",");
             sucursal=listCodSucu;    */

        /*FIN MODIFICACION JRA*/

        //List listadoCuentas = new ArrayList();
        List listadoUnidMone = new ArrayList();
        //String[] chksCuenta = null;
        //String codCuentas = null;
        TiposBean[] listadoUnidMoneArray = null;
         listadoUnidMone = servicioHermetic.getListTipoUnidMoneMultiSucu(listCodClies, listCodSucurs, listCodCtaCadena);
         request.getSession(false).setAttribute("listadoUnidMone",listadoUnidMone);
         /*
        try{
            if("1".equals(cuenta)){
                //listadoCuentas = servicioHermetic.getCuentas(sucursal, cliente);
                //chksCuenta = Util.listToStringArrayMultiSucu(listadoCuentas);     
                //codCuentas = Util.arrayToString(chksCuenta,",");      
                listadoUnidMone = servicioHermetic.getListTipoUnidMoneMultiSucu(listCodClies, listCodSucurs, listCodCtaCadena);
                //Si se marco TODOS, se borran las cuentas antes seleccionadas
                //request.getSession(false).setAttribute("chksCuenta",null);
            }
            if("2".equals(cuenta)){
                //chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
                //codCuentas = Util.arrayToString(chksCuenta,",");
                //request.getSession(false).setAttribute("cksCuenta",chksCuenta);
                ///if (codCuentas!=null && !codCuentas.equals("")){
                  listadoUnidMone = servicioHermetic.getListTipoUnidMoneMultiSucu(listCodClies, listCodSucurs, listCodCtaCadena);                    
                  request.getSession(false).setAttribute("listadoUnidMone",listadoUnidMone);
                //}
            }
            /**JRA-12/07/2011- Se agregaron cuentas Principales*/
           /* if ("3".equals(cuenta)){
                //Obtener las cuentas del procedure
                //listadoCuentas=servicioHermetic.getListMainCntas(sucursal,cliente);
                //chksCuenta = Util.listToStringArrayMultiSucu(listadoCuentas);     
                //codCuentas = Util.arrayToString(chksCuenta,",");      
                listadoUnidMone = servicioHermetic.getListTipoUnidMoneMultiSucu(listCodClies, listCodSucurs, listCodCtaCadena);
                //Si se marco PRINCIPALES, se borran las cuentas antes seleccionadas
                //request.getSession(false).setAttribute("chksCuenta",null);
            }
        }catch(Exception e){
            logger.error(e);
        }*/
        //Reiniciar las bovedas seleccionadas
        request.getSession(false).setAttribute("chksModulo",null);
        //Reinicar el tipoUnidad en Session
        request.getSession(false).setAttribute("tipoUnidMone",null);
        
        listadoUnidMoneArray = new TiposBean[listadoUnidMone.size()];
        listadoUnidMone.toArray(listadoUnidMoneArray);
        return listadoUnidMoneArray;
    }
}
